import strat from '@/start'
import core from '@/core'
/**
 * 写入数据库信息
 * 只有在开发模式下前端调用，并且传入需要更新的数据库
 * 
 * data：需要更新的数据库信息。如果是数组或者字符串，默认是新增的类型，
 * 	add: [] 需要新增的数据库
 * 	alert: [] 需要覆盖修改的数据库。不修改单个，一定是删除后再新增
 * 	delete: [] 需要删除的数据库
 * provider：当前云服务空间的类型，用于确定数据库文件所在路径
 * cloud：当前操作的云服务空间对象
 * 
 * 字段的必要性，只在具体字段中控制
 */
module.exports = () => {
	const {dbupdates} = strat
	if (process.env.NODE_ENV === 'development' && dbupdates) {
		var provider, json, YunInfo
		try {
			// 获取当前的云服务空间类型
			json = require(`@/.hbuilderx/launch.json`)
			if (json && json.configurations && json.configurations.length > 0) {
				if (json.configurations[0].provider) {
					provider = json.configurations[0].provider
					YunInfo = strat.cloud[provider]
				}
			}
		} catch(e) {
			provider = dbupdates.provider
			YunInfo = strat.cloud[provider]
		}
		if (YunInfo && provider) {
			const cloud = uniCloud.init(YunInfo)
			if (dbupdates && cloud) {
				/**
				 * readArr：需要读取文件的数组；
				 * removeArr：需要删除的数组
				 * addArr：实际需要添加进数据库的信息
				 */
				const readArr = [], removeArr = [], addArr = []
				if (dbupdates.all) {
					// 删除所有 ，然后新增所有
					const arr = Object.keys(core.request.basedata[YunInfo.key].database)
					arr.map(key => {
						readArr.push(key)
					})
				} else {
					// 需要新增的数据库。添加进读取数组中
					dbupdates.add && dbupdates.add.map(key => {
						readArr.push(key)
					})
					// 需要修改的数据库。添加进读取、删除数组中
					dbupdates.alert && dbupdates.alert.map(key => {
						readArr.push(key)
						removeArr.push(key)
					})
					// 需要删除的数据库。添加进删除数组中
					dbupdates.delete && dbupdates.delete.map(key => {
						removeArr.push(key)
					})
				}
				if (readArr.length > 0) {
					readArr.map(name => {
						/**
						 * 读取数据库文件
						 * 会有require缓存，delete require.cache方法并不管用
						 * 建议若有修改，就重新启动项目
						 */
						// delete require.cache[require.resolve(`@/uniCloud-${provider}/database/${name}.schema.json`)]
						const schema = require(`@/uniCloud-${provider}/database/${name}.schema.json`)
						if (schema) {
							/**
							 * onlyKeys：直接读取schema
							 * required：直接读取required
							 * defaultValue：需读取每一个字段信息
							 */
							if (!schema.defaultValue) {
								schema.defaultValue = {}
							}
							var {properties, defaultValue = {}} = schema
							/**
							 * 对默认值的判断
							 * 给HISTORY默认值：[]
							 * 给remove默认值：false
							 */
							if (!defaultValue.HISTORY) {
								defaultValue.HISTORY = []
							}
							if (!(defaultValue.remove || defaultValue.remove === false)) {
								defaultValue.remove = false
							}
							properties && Object.keys(properties).forEach(key => {
								const propsObj = properties[key]
								// 获取默认值
								if (Object.keys(properties[key]).indexOf('defaultValue') > -1) {
									defaultValue[key] = propsObj.defaultValue
								}
								// 从固定的fixcolumns中赋值
								if (core.request.fixcolumns[key]) {
									Object.keys(core.request.fixcolumns[key]).forEach(k => { // 如果原值已经存在的，就不赋值
										if (!propsObj[k] && propsObj[k] !== 0 && propsObj[k] !== false) {
											propsObj[k] = core.request.fixcolumns[key][k]
										}
									})
								}
							})
							schema.name = name
							schema.space = YunInfo.key
							schema.defaultValue = defaultValue
							addArr.push(schema)
						}
						// 清理读取缓存
						const modulePath = require.resolve(`@/uniCloud-${provider}/database/${name}.schema.json`)
						delete require.cache[modulePath]
					})
				}
				/**
				 * 实际操作
				 * 先删除需要删除的数据
				 * 再添加需要添加的数据
				 */
				const db = cloud.database()
				const dbCmd = db.command
				const table = db.collection('a-a-table')
				
				const addAction = () => {
					if (addArr.length > 0) {
						table.add(addArr).then(res => {
							console.log(`新增${res.result.inserted}条数据库信息`)
						}).catch(err => {
							console.error(err)
						})
					} else {
						// 没有就不处理，也不用输出打印信息
					}
				}
				if (dbupdates.all) {
					table.where({_id: dbCmd.exists(true).or(dbCmd.exists(false)).or(dbCmd.eq(''))}).remove().then(res => {
						console.log(`删除${res.result.deleted}条数据库信息`)
						addAction()
					}).catch(err => {
						console.error(err)
					})
				} else if (removeArr.length > 0) {
					table.where({name: dbCmd.in(removeArr)}).remove().then(res => {
						console.log(`删除${res.result.deleted}条数据库信息`)
						addAction()
					}).catch(err => {
						console.error(err)
					})
				} else {
					addAction()
				}
			} else {
				console.warn('没有需要更新的数据库信息')
			}
		} else {
			console.warn('云服务空间信息不存在')
		}
	}
}